Об использовании венгерской нотации

Одним из идиотских (IMHO) введений micro$oft'а является повсеместное использование так называемой венгерской нотации в программах на С и С++.

Венгернская нотация заключается в добавлении к имени переменной специаьлных префиксов, несущих информацию о ее типе.

Так счтитается что запись lpszFileName помогает понять, что данная переменная является указателелем на строку, завершенную нулем (кто-бы мог подумать :))), а bSuccess - переменной булевского типа (а не строка почемуто :))).

В языке С++ пошли еще дальше - к именам переменных-членов класса добавляется (перед префиксом типа) дополнительный префикс "m_".

Аналогично к именам глобальных переменных добавляется префикс "g_".

Очень хорошее обоснование бессмысленности подобной нотации , содержится в книге Алена Голуба "С и С++. Правила программирования.".

Ниже я изложу свои сооражения о венгерской нотации вместе с соображениями А. Голуба.

Считается (интересно кем именно), что использовании венгерской нотации позволяет избегать ряда ошибок, поскольку сразу по имени переменной ясен ее тип и локализация (член класса, глобальная перпеменная и т.п.)

На мой взгляд, если программисту, для того, чтобы не путаться с типами переменных (хотя современные компиляторы давно уже умеют выдавать предупреждения при подозрительных операциях преобразования типов, не говоря уже об ошибках при недопустимых операциях) приходится пользоваться венгерской нотацией, то ему просто срочно нужно пойти поучиться правильно писать программы.

Правильным подходом, к тому же заметно облегчающему читаемость программ, является использование осмысленных имен для переменных. Если переменная называется fileName, то ее тип сразу же становится понятен по ее названию.

Т.е. при использовании осмысленных имен переменных подобная проблма даже не возникает и Вы заметно улучшаете читамость (и понимаемость Вашей программы).

Если Вы путаете переменны - члены класса с глобальными переменными и параметрами методов, то это говорит только о кривости Вашего кода.

Единственным, на мой взгляд, случаем, когда может возникнуть путаница параметра и члена класса - это передача значения, для его присваивания члену класса.

Это часто встречается в конструкторах класса и в set-методах.

Наиболее удачным подходом здесь мне кажется подход, принятый у разработчкиов на Smalltalk'е - к имени параметра в качестве префикса добавляется один из артиклей английского языка ("a", "an", "the" ).

void MyClass :: setValue ( int theValue )
{
	value = theValue;
}

В set-методах также хорошо смотрится использования в качестве префикса "new".

Такой подход приводит к изменению имен лишь небольшого числа переменных и не уродует методы класса.

Насчет глобальных переменных - правильно выбранное имя во многих случаях помогает, если же нет - попробуйте сократить их количество (использование большого числа глобальных переменных вообще считается дурным стилем).

Если посмотреть, на что была изначально направлена венгерская нотация, то становится понятно, что это скорее повышение читаемости и понимаемости исходного текста программ.

Процедура рефакторинга как раз и направлена на достижение именно этих целей и справляется с ними намного удачнее.

При этом можно не ждать пока Ваш код станет абсолютно нечитаемым, а сразу начать его писать исходя из принципов, используемых в рефакторинге.

Наиболее правильной книгой по этой теме является Рефакторинг. Улучшение существующего кода Фаулер М.

Эту книгу сейчас легко можно найти и она стоит своих денег.

К сожалению, очень многие экономят на именах переменных (хотя несколько секунд выйгранных сейчас легко превращаются во многие часы на понимание того, как ЭТО работает - или же почему не работает).

В заключении - просто достало постоянно видеть программы, загаженные венгерским стилем. Возникает ощущение что нежеление (или неспособность думать) заменяют бездумным копированим стиля от m$, который так же крив, как и их программы (это сугубо мое личное НО).

Valid HTML 4.01 Transitional

Напиши мне
Используются технологии uCoz